package com.jacob.androidstudy.javanote;
/**
 * 访问权限是编译时的概念，就是说只有编译器会检查访问权限。
 * 违反访问权限的话，编译器会报错，也就不能生成字节码。
 * 只要有办法能绕过编译器，就可以破坏访问权限的限制。（比如反射）
 */


/**
 * 类访问权限：
 * public：公开的，所有类和方法都可以访问。一个文件只能有一个public类。
 * 不写：默认的，也叫友好的，只有本包下的类可以访问。
 * 
 * 类修饰符：
 * final：final类不能被继承，没有子类。
 *         如果类不需要有子类，类的实现细节不允许改变，并且确信这个类不会再被扩展，那么就设计为final类。
 * abstract：抽象类。
 *               抽象类不能被实例化，但可以定义一个引用。
 *               抽象类中可以有，也可以没有抽象方法；类中若有抽象方法，则必须定义为抽象类。
 */
public class Java访问权限符和修饰符 {
	
	/**
	 * 域访问权限：
	 * public：公开的，所有类和方法都可以访问。从类的封装性上来考虑将一般很少使用，通常只用于常量域。
	 * protected：保护的，只有自己、本包下的类和子类可以访问。
	 * 不写：默认的，也叫友好的，只有自己和本包下的类可以访问。也很少使用。
	 * private：私有的，只有自己内部的方法可以访问。当然内部类也可以访问其外部类的private域。
	 * 
	 * 域修饰符：
	 * static：此修饰符修饰的域是静态的。
	 *           静态域在整个类中只有一个，实例域每个对象都有一个。
	 *           静态域在类加载时创建，实例域在生成对象时创建。
	 *           静态域通过类访问，实例域通过对象访问。
	 * final：此修饰符修饰的域是不可改变的。
	 *          final域必须在定义时，或构造方法中赋初值。
	 */
	int instanceVariable;
	static int classVariable;
	static final int CONSTANT = 0;
	
	/**
	 * 方法访问权限：
	 * public：公开的，所有类和方法都可以访问。
	 * protected：保护的，只有自己、本包下的类和子类可以访问。
	 * 不写：默认的，也叫友好的，只有自己和本包下的类可以访问。
	 * private：私有的，只有自己内部的方法可以访问。当然内部类也可以访问其外部类的private方法。
	 * 
	 * 方法修饰符
	 * static：此修饰符修饰的方法是静态的。
	 *           静态方法中不能用this和super。
	 *           只能访问所属类的静态域和静态方法，不能直接访问所属类的实例域和实例方法。
	 *           因为static方法独立于任何实例，因此static方法必须被实现，而不能是抽象的abstract。
	 * final：此修饰符修饰的方法，子类不能覆盖。final不能用于修饰构造方法。
	 * abstract：此修饰符修饰的方法是抽象的。
	 *               抽象方法只定义方法头，没有方法体。
	 *               抽象方法只能出现在抽象类中。
	 */
	public static void main(String[] args) {
		
		/**
		 * 变量修饰符：
		 * final：此修饰符修饰的变量只能被赋值1次。一旦赋值后，就不能再被更改了。
		 */
		final int VAR_INT = 100;
		
	}

}
